import java.util.HashMap;

public class LeetCode03 {
    // 方法用于返回字符串中最长非重复子串的长度
    public static int lengthOfLongestSubstring(String s) {
        int begin = 0; // 子串开始位置，也代表滑动窗口的左边界
        int maxLength = 0; // 记录最长无重复子串的长度
        HashMap<Character, Integer> map = new HashMap<>(); // 使用哈希表存储字符及其最新出现的位置

        // 遍历字符串中的每一个字符，end作为滑动窗口的右边界
        for (int end = 0; end < s.length(); end++) {
            char ch = s.charAt(end); // 当前字符

            // 如果map中已经包含当前字符，说明遇到了重复字符
            if (map.containsKey(ch)) {
                // 更新begin到重复字符上一次出现位置的下一个位置
                // 注意：这里有一个逻辑错误，如果重复字符在当前窗口之前，begin不应被更新。
                // 正确的做法是使用Math.max来确保begin只向前移动。
                begin = Math.max(begin, map.get(ch) + 1);
            }
            // 更新当前字符的位置
            map.put(ch, end);

            // 每次迭代时，计算当前窗口的大小，并与maxLength比较，保留较大的值
            maxLength = Math.max(maxLength, end - begin + 1);
        }

        // 返回最长无重复子串的长度
        return maxLength;
    }

    public static void main(String[] args) {
        // 调用方法并打印结果
        System.out.println(lengthOfLongestSubstring("abcabcbb")); // 应输出3，因为"abc"是最长的无重复字符子串
    }
}